// 2.利用回调函数进行ajax封装----完成
const $ajax = function (potion) {
  let promist = new Promise((resolve, reject) => {
    //由于参数超过4个所以这里的形参设置成一个对象，且对象中的数据有：method\url\async\success\error\data
    let xhr = new XMLHttpRequest(); //实例化Ajax对象

    // 第一步判断请求方式同时设定默认请求方式为get
    potion.method = potion.method !== 'post' ? 'get' : 'post';

    // 第二步判断url请求地址是否存在，不存在则抛出错误终止代码
    if (!potion.url) {
      throw new Error('请求地址不能为空！！！');
    }
    // 第三步判断是否为异步，同时设置默认为异步这里支持隐式转换，为false的情况有"false",false,0,null,undefined,"";
    potion.async = !!potion.async; //通过双感叹号将数据转成布尔类型

    // 第五步判断请求方式是那种，因为不同的请求方式数据传输的方式是不一样的，同时也要判断数据是否存在
    if (potion.data && potion.method === 'get') {
      //这里当数据存在且请求方式是get所以要对地址进行字符串拼接
      potion.url += '?' + stringObj(potion.data);
    }
    xhr.open(potion.method, potion.url, potion.async);
    if (potion.data && potion.method === 'post') {
      //这里使用send加上设置请求头进行post数据传输
      xhr.setRequestHeader('content-type', 'application/x-www-form-urlencoded');
      xhr.send(stringObj(potion.data));
    } else {
      xhr.send();
    }

    // 第四步异步和同步的代码执行方向不一样所以这里也需要做分支
    if (potion.async) {
      //异步代码
      xhr.onreadystatechange = function () {
        if (xhr.readyState === 4) {
          if (xhr.status == 200 || xhr.status == 304) {
            // 第六步：当http的状态码等于200或304时表示响应成功可以获取数据了
            // 但由于这个函数内是异步的所以需要通过回调函数来将获取到的值传递出去
            // potion.success &&
            // typeof potion.success === 'function' &&
            // potion.success(xhr.responseText);

            resolve(xhr.responseText);
            // 这里判断success是否存在且是否为函数如果是才去执行
          } else {
            //这里说明响应失败，可能地址有误抛出错误信息，同样也是通过回调函数将信息抛出
            // potion.error &&
            //   typeof potion.error === 'function' &&
            //   potion.error('数据接口路径有误！！！');
            reject('数据接口路径有误');
          }
        }
      };
    } else {
      //同步代码----同步代码也需要进行判断
      if (xhr.status == 200 || xhr.status == 304) {
        //同步代码同样需要判断响应的成功与否
        // 同步代码虽然可以直接将数据传出，但为了方法统一所以也使用回调函数将数据传出
        // potion.success &&
        //   typeof potion.success === 'function' &&
        //   potion.success(xhr.responseText);

        resolve(xhr.responseText);
        // 这里判断success是否存在且是否为函数如果是才去执行
      } else {
        //这里说明响应失败，可能地址有误抛出错误信息，同样也是通过回调函数将信息抛出
        // potion.error &&
        //   typeof potion.error === 'function' &&
        //   potion.error('数据接口路径有误！！！');

        reject('数据接口路径有误');
      }
    }
  });
  return promist;
};

// 3.配合ajax地址栏拼接函数---完成
const stringObj = function (obj) {
  //参一：表示需要转成字符串的对象
  // 第一步判断接受的数据是否是一个对象，如果是一个对象那么对对象做解析，如果不是那么说明
  let arr = [];
  if (Object.prototype.toString.call(obj) === '[object Object]') {
    for (const key in obj) {
      arr.push(key + '=' + obj[key]);
    }
  }
  return arr.join();
};
// 1.获取DOM元素节点的函数封装---完成
const $ = function (node, numFalg) {
  //第一个参数表示DOM节点的选择器，第二个参数表示是否是获取多个节点
  if (numFalg) {
    //如果numfalg存在表示取的元素有多个
    return document.querySelectorAll(node);
  } else {
    return document.querySelector(node);
  }
};
// 6.图片懒加载

const lan = function () {
  // 图片懒加载---开始
  let images = document.querySelectorAll('.main_section ul li img');
  const callback = (entries) => {
    entries.forEach((entry) => {
      if (entry.isIntersecting) {
        const image = entry.target;
        const data_src = image.getAttribute('data-src');
        image.setAttribute('src', data_src);
        observer.unobserve(image);
        console.log('触发');
      }
    });
  };
  const observer = new IntersectionObserver(callback);
  images.forEach((image) => {
    observer.observe(image);
  });

  // 图片懒加载---结束
};

function jian() {
  // inp.addEventListener('input', Detection());
  if (!cookie.get('shopCookie')) {
    return {};
  } else {
    return JSON.parse(cookie.get('shopCookie'));
  }
}

// 4.1 cookie重新封裝使用對象形式將三個方法合并處理--Cookie這個對象中有三個方法分別表示，
// set方法創建cookie，get方法獲取cookie值，remove方法刪除cookie
const cookie = {
  set(key, value, days) {
    let date = new Date();
    date.setDate(date.getDate() + days);
    document.cookie = `${key}=${value};expires=${date}`;
  },
  get(key) {
    for (const value of document.cookie.split('; ')) {
      let vName = value.split('=');
      if (vName[0] === key) {
        return vName[1];
      }
    }
  },
  remove(key) {
    let date = new Date();
    date.setDate(date.getDate() - 1);
    document.cookie = `${key}=remove;expires=${date}`;
  },
};

// 7.获取地址栏的数据并返回一个对象
const aData = function () {
  let arr = window.location.search.substring(1).split('&');
  let obj = {};
  for (const key of arr) {
    obj[key.split('=')[0]] = key.split('=')[1];
  }
  return obj;
};

export {  cookie };
